#!/usr/bin/env python
#-*- coding:utf-8 -*-

import re

from Tarea import * 
import Tesauro

# Transforma lineas de palabras separadas por algun elemento de @separadores, en lineas de palabras separadas por espacios que no estan en el conjunto listaNegra.
class Limpieza(Tarea):	
	# Metodo de utilidad para construir una lista negra a partir de un tesauro.
	# TODO La funcion esta definida aca, pero deberia definirse fuera de la clase Limpieza y usada para construir una instancia.
	@classmethod
	def _listaNegraFromTesauro(cls, tesauro = Tesauro.Tesauro()):
		# Importo del tesauro los listados de palabras que me interesa filtrar.
		listaNegra = set();		
		listaNegra.update( tesauro.adverbios )
		listaNegra.update( tesauro.pronombresPersonales )
		listaNegra.update( tesauro.pronombresRelativos )
		listaNegra.update( tesauro.pronombresIndefinidos )
		listaNegra.update( tesauro.pronombresDemostrativos )
		listaNegra.update( tesauro.pronombresInterrogativos )
		listaNegra.update( tesauro.preposiciones )
		listaNegra.update( tesauro.articulosDefinidos )
		listaNegra.update( tesauro.articulosIndefinidos )
		listaNegra.update( tesauro.articulosPosesivos )
		listaNegra.update( tesauro.articulosDemostrativos )
		listaNegra.update( tesauro.cuantificadoresCardinales )
		listaNegra.update( tesauro.cuantificadoresOrdinales )
		listaNegra.update( tesauro.cuantificadoresPartitivos )
		listaNegra.update( tesauro.distributivos )
		listaNegra.update( tesauro.indefinidos )
		listaNegra.update( tesauro.coordinantesCopulativos )
		listaNegra.update( tesauro.coordinantesDisyuntivos )
		listaNegra.update( tesauro.coordinantesAdversativos )
		listaNegra.update( tesauro.coordinantesCasuales )
		listaNegra.update( tesauro.coordinantesConsecutivos )
		listaNegra.update( tesauro.reforzadores )
		listaNegra.update( tesauro.cuasiCoordinantes )
		listaNegra.update( tesauro.enlaces )
		listaNegra.update( tesauro.subordinantes )

		return listaNegra
	
	def __init__(self, nombre, entrada = None, noLeer = None, salida = None, log = None, errores = None, separadores = None, listaNegra = None ):
		Tarea.__init__(self, nombre, entrada, noLeer, salida, log, errores)

		if (listaNegra != None):
			self.listaNegra = listaNegra
		else:
			self.listaNegra = Limpieza._listaNegraFromTesauro();

		if (separadores != None):
			self.separadores = separadores
		else:
			self.separadores = [' ',',','.','\n','\t',':',';']
#			self.separadores.append( ['#', '[', ']', '(', ')', '{', '}', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ])

		# Mapa para reemplazar caracteres acentuados.
		self.acentos = {}	
		
	def _reemplazarAcentos(self, string):
		if ( len(self.acentos.keys()) == 0 ):
			for a in ('à', 'á', 'â', 'ã', 'ä', 'à'): self.acentos[a] = 'a'
			for c in ('ç'): self.acentos[c] = 'c'
			for e in ('è','é','ê','ë'): self.acentos[e] = 'e'
			for i in ('ì','í','î','ï'): self.acentos[i] = 'i'
			for n in ('ñ'): self.acentos[n] = 'n'
			for o in ('ò','ó','ô','õ','ö'): self.acentos[o] = 'o'
			for u in ('ù','ú','û','ü'): self.acentos[u] = 'u'
			for y in ('ý','ÿ'): self.acentos[y] = 'y'
			for A in ('À','Á','Â','Ã','Ä') : self.acentos[A] = 'A'
			for C in ('Ç'): self.acentos[C] = 'C'
			for E in ('È','É','Ê','Ë'): self.acentos[E] = 'E'
			for I in ('Ì','Í','Î','Ï'): self.acentos[I] = 'I'
			for N in ('Ñ'): self.acentos[N] = 'N'
			for O in ('Ò','Ó','Ô','Õ','Ö'): self.acentos[O] = 'O'
			for U in ('Ù','Ú','Û','Ü'): self.acentos[U] = 'U'
			for Y in ('Ý'): self.acentos[Y] = 'Y'

		for vieja, nueva in self.acentos.items():
			string = string.replace(vieja,nueva)
		return string

	def process(self, linea, nReg):
		filtrada = self._reemplazarAcentos(linea.strip())
		filtrada = filtrada.lower();
		filtrada = ' '.join( re.split('['+''.join(self.separadores)+']+',filtrada) )
		filtrada = ' '.join( re.split('\d+',filtrada) )
		partes = re.split('\W+', filtrada)

		# Lista negra de palabras (articulos, etc...)
		pos = 0
		for p in partes:
			if (not p in self.listaNegra) and (len(p) > 1):
				partes[pos] = p
				pos += 1
		del partes[pos:]

		resultado = (' '.join(partes)).strip()
		if len(resultado) > 0:
			self.salida.write( resultado + '\n' );
		
		return Tarea.NOERROR

if __name__ == '__main__':
	pass

